home *** CD-ROM | disk | FTP | other *** search
-
- /* xlisp - a small subset of lisp */
-
-
- /* system specific definitions */
-
- /* DEFEXT define to enable default extension of '.lsp' on 'load' */
- /* FGETNAME define if system supports 'fgetname' */
- /* NNODES number of nodes to allocate in each request */
- /* TDEPTH trace stack depth */
- /* KEYMAPCLASS define to include the 'Keymap' class */
-
-
- /* for the VAX-11 C compiler */
-
- #ifdef vms
- #define DEFEXT
- #define FGETNAME
- #define KEYMAPCLASS
- #define NNODES 2000
- #define TDEPTH 1000
- #endif
-
- /* for the DECUS C compiler */
-
- #ifdef decus
- #define DEFEXT
- #define KEYMAPCLASS
- #define NNODES 200
- #define TDEPTH 100
- #endif
-
- /* for unix compilers */
-
- #ifdef unix
- #define KEYMAPCLASS
- #define NNODES 200
- #define TDEPTH 100
- #endif
-
- /* for the AZTEC C compiler */
-
- #ifdef AZTEC
- #define DEFEXT
- #define KEYMAPCLASS
- #define NNODES 200
- #define TDEPTH 100
- #define getc(fp) getch(fp)
- #define kbin() CPM(6,0xFF)
- #define malloc alloc
- #endif
-
- /* for the CI_86 PC compiler */
-
- #ifdef CI_86
- #define REALS /* Enables real arithmetic code */
- /* #define DEBUG Enables debug code */
- /* Module XLDEBUG need not be linked
- if DEBUG is undefined */
- #define DEFEXT
- #define KEYMAPCLASS
- #define NNODES 200
- #define TDEPTH 100
- #define strchr index
- #endif
-
- /* default important definitions */
-
- #ifndef NNODES
- #define NNODES 200
- #endif
-
- #ifndef TDEPTH
- #define TDEPTH 100
- #endif
-
- /* useful definitions */
-
- #define TRUE 1
- #define FALSE 0
-
- /* program limits */
-
- #define STRMAX 100 /* maximum length of a string constant */
-
- /* node types */
-
- #define FREE 0
- #define SUBR 1
- #define LIST 2
- #define SYM 3
- #define INT 4
- #define STR 5
- #define OBJ 6
- #define FPTR 7
- #define KMAP 8
- #define REAL 9
-
- /* node flags */
-
- #define MARK 1
- #define LEFT 2
-
- /* string types */
-
- #define DYNAMIC 0
- #define STATIC 1
-
- /* struct defines */
-
- struct xsym {
- char *xsy_name; /* symbol name */
- struct node *xsy_value; /* the current value */
- };
-
- /* subr node structure */
-
- struct xsubr {
- struct node *(*xsu_subr)(); /* pointer to an internal routine */
- };
-
- /* list node structure */
-
- struct xlist {
- struct node *xl_value; /* value at this node */
- struct node *xl_next; /* next node */
- };
-
- /* integer node structure */
-
- struct xint {
- int xi_int; /* integer value */
- };
-
- #ifdef REALS
- /* real node structure */
-
- struct xreal {
- long float xr_real; /* real value */
- };
- #endif
-
- /* string node structure */
-
- struct xstr {
- int xst_type; /* string type */
- char *xst_str; /* string pointer */
- };
-
- /* object node structure */
-
- struct xobj {
- struct node *xo_obclass; /* class of object */
- struct node *xo_obdata; /* instance data */
- };
-
- /* file pointer node structure */
-
- struct xfptr {
- FILE *xf_fp; /* the file pointer */
- };
-
- /* keymap structure */
-
- struct xkmap {
- struct node *(*xkm_map)[]; /* selection pointer */
- };
-
-
- /* shorthand macros for accessing node substructures */
-
- /* symbol node */
-
- #define n_symname n_info.n_xsym.xsy_name
- #define n_symvalue n_info.n_xsym.xsy_value
-
- /* subr node */
-
- #define n_subr n_info.n_xsubr.xsu_subr
-
- /* list node (and message node and binding node) */
-
- #define n_listvalue n_info.n_xlist.xl_value
- #define n_listnext n_info.n_xlist.xl_next
- #define n_msg n_info.n_xlist.xl_value
- #define n_msgcode n_info.n_xlist.xl_next
- #define n_bndsym n_info.n_xlist.xl_value
- #define n_bndvalue n_info.n_xlist.xl_next
- #define n_left n_info.n_xlist.xl_value
- #define n_right n_info.n_xlist.xl_next
- #define n_ptr n_info.n_xlist.xl_value
-
- /* integer, real and string nodes */
-
- #define n_int n_info.n_xint.xi_int
- #define n_real n_info.n_xreal.xr_real
- #define n_str n_info.n_xstr.xst_str
- #define n_strtype n_info.n_xstr.xst_type
-
- /* object node */
-
- #define n_obclass n_info.n_xobj.xo_obclass
- #define n_obdata n_info.n_xobj.xo_obdata
-
- /* file pointer node */
-
- #define n_fname n_info.n_xfptr.xf_name
- #define n_fp n_info.n_xfptr.xf_fp
-
- /* key map node */
-
- #define n_kmap n_info.n_xkmap.xkm_map
-
-
- /* node structure */
-
- struct node {
- char n_type; /* type of node */
- char n_flags; /* flag bits */
- union { /* value */
- struct xsym n_xsym; /* symbol node */
- struct xsubr n_xsubr; /* subr node */
- struct xlist n_xlist; /* list node */
- struct xint n_xint; /* integer node */
- #ifdef REALS
- struct xreal n_xreal; /* real node */
- #endif
- struct xstr n_xstr; /* string node */
- struct xobj n_xobj; /* object node */
- struct xfptr n_xfptr; /* file pointer node */
- struct xkmap n_xkmap; /* key map node */
- } n_info;
- };
-
- #define null_node = {'\0','\0'}
-
- /* external procedure declarations */
-
- extern struct node *xlread(); /* read an expression */
- extern struct node *xleval(); /* evaluate an expression */
- extern struct node *xlarg(); /* fetch an argument */
- extern struct node *xlevarg(); /* fetch and evaluate an argument */
- extern struct node *xlmatch(); /* fetch an typed argument */
- extern struct node *xlevmatch(); /* fetch and evaluate a typed arg */
- extern struct node *xlsend(); /* send a message to an object */
- extern struct node *xlmfind(); /* find the method for a message */
- extern struct node *xlxsend(); /* execute a message method */
- extern struct node *xlenter(); /* enter a symbol into the oblist */
- extern struct node *xlsave(); /* generate a stack frame */
- extern struct node *xlobsym(); /* find an object's class or instance
- variable */
- extern struct node *xlclass(); /* enter a class definition */
- extern struct node *xlivar(); /* get an instance variable */
- extern struct node *xlcvar(); /* get an instance variable */
- extern struct node *newnode(); /* allocate a new node */
- extern char *stralloc(); /* allocate string space */
- extern char *strsave(); /* make a safe copy of a string */